home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 August: Tool Chest / Dev.CD Aug 00 TC Disk 2.toast / pc / sample code / interapplication comm / 7edit / source / svaecountelements.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-23  |  5.6 KB  |  201 lines

  1. /*
  2.     File:        SVAECountElements.c
  3.  
  4.     Contains:    
  5.  
  6.     Written by: Original version by Jon Lansdell and Nigel Humphreys.
  7.                 3.1 updates by Greg Sutton.
  8.  
  9.     Copyright:    Copyright © 1995-1999 by Apple Computer, Inc., All Rights Reserved.
  10.  
  11.                 You may incorporate this Apple sample source code into your program(s) without
  12.                 restriction. This Apple sample source code has been provided "AS IS" and the
  13.                 responsibility for its operation is yours. You are not permitted to redistribute
  14.                 this Apple sample source code as "Apple sample source code" after having made
  15.                 changes. If you're going to re-distribute the source, we require that you make
  16.                 it clear in the source that the code was descended from Apple sample source
  17.                 code, but that you've made changes.
  18.  
  19.     Change History (most recent first):
  20.                 7/20/1999    Karl Groethe    Updated for Metrowerks Codewarror Pro 2.1
  21.                 
  22.  
  23. */
  24. #include "SVAECountElements.h"
  25.  
  26. #include "SVToken.h"
  27. #include "SVEditAEUtils.h"
  28. #include "SVAETextUtils.h"
  29. #include "SVAEWindowUtils.h"
  30.  
  31.  
  32. #pragma segment AppleEvent
  33.  
  34.  
  35. // -----------------------------------------------------------------------
  36. //    Name:       DoCountElements
  37. //    Purpose:    Handles the Number Of Elements AppleEvent.
  38. // -----------------------------------------------------------------------
  39.  
  40. pascal OSErr    DoCountElements(const AppleEvent    *theAppleEvent,
  41.                                       AppleEvent    *reply,
  42.                                       long            handlerRefCon)
  43. {
  44. #pragma unused (handlerRefCon)
  45.  
  46.     AEDesc       container = {typeNull, NULL},
  47.                 countDesc = {typeNull, NULL};
  48.     DescType     desiredType;
  49.     DescType     returnedType;
  50.     Size         actualSize;
  51.       OSErr        err;
  52.     
  53.         // pick up direct object, which is the container
  54.         // in which things are to be counted.
  55.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &container);
  56.     if (noErr != err) goto done;
  57.         
  58.         // now the class of objects to be counted
  59.     err = AEGetParamPtr(theAppleEvent, keyAEObjectClass, typeType,
  60.                                 &returnedType, (Ptr)&desiredType, sizeof(desiredType), &actualSize);
  61.     if (noErr != err) goto done;
  62.         
  63.         // missing any parameters?
  64.     err = GotRequiredParams(theAppleEvent);
  65.     if (noErr != err) goto done;
  66.     
  67.         // now get descriptor for count - put through function that
  68.         // can handle lists.
  69.     err = GetDescForNumberOfElements(desiredType, &container, &countDesc);
  70.     
  71.     err = AddResultToReply(&countDesc, reply, err);
  72.  
  73. done:
  74.     if (container.dataHandle)
  75.         AEDisposeDesc(&container);
  76.     
  77.     return(err);
  78. } // DoCountElements
  79.  
  80.  
  81. OSErr    GetDescForNumberOfElements(DescType desiredType, AEDesc* container, AEDesc* result)
  82. {
  83.     long        itemCount,
  84.                 index,
  85.                 elementCount;
  86.     AEDesc        tempDesc = {typeNull, NULL},
  87.                 aDesc = {typeNull, NULL},
  88.                 resultDesc = {typeNull, NULL};
  89.     DescType    returnedType;
  90.     OSErr        err;
  91.     
  92.             // If it's an object specifier, resolve into a token
  93.     if (typeObjectSpecifier == container->descriptorType)
  94.         err = AEResolve(container, kAEIDoMinimum, &tempDesc);
  95.     else    // Otherwise, just copy it
  96.         err = AEDuplicateDesc(container, &tempDesc);
  97.  
  98.     if (noErr != err) goto done;
  99.  
  100.     if (typeAEList == tempDesc.descriptorType)
  101.     {
  102.         err = AECreateList(NULL, 0 , false, result);    // Result will also be a list of items
  103.         if (noErr != err) goto done;
  104.         err = AECountItems(&tempDesc, &itemCount);
  105.         if (noErr != err) goto done;
  106.  
  107.         for (index = 1; index <= itemCount; index++)    // Do in forward order
  108.         {
  109.             err = AEGetNthDesc(&tempDesc, index, typeWildCard, &returnedType, &aDesc);
  110.  
  111.             if (noErr == err)        // Call this function recursively if necessary
  112.                 err = GetDescForNumberOfElements(desiredType, &aDesc, &resultDesc);
  113.             
  114.             if (noErr == err)        // Add item to the end of our list
  115.                 err = AEPutDesc(result, 0, &resultDesc);
  116.             
  117.             if (aDesc.dataHandle)
  118.                 AEDisposeDesc(&aDesc);
  119.             if (resultDesc.dataHandle)
  120.                 AEDisposeDesc(&resultDesc);
  121.         }
  122.     }
  123.     else
  124.     {
  125.         err = MyCountProc(desiredType, tempDesc.descriptorType, &tempDesc, &elementCount);
  126.         if (noErr != err) goto done;
  127.         err = AECreateDesc(typeLongInteger, (Ptr)&elementCount, sizeof(elementCount), result);
  128.     }
  129.  
  130. done:
  131.     if (aDesc.dataHandle)
  132.         AEDisposeDesc(&aDesc);
  133.     if (resultDesc.dataHandle)
  134.         AEDisposeDesc(&resultDesc);
  135.  
  136.     return(err);
  137. }
  138.  
  139.  
  140. // This count procedure is installed along with MyCaompareProc() to support
  141. // formTest and formWhose.
  142.  
  143. pascal OSErr MyCountProc(DescType desiredType, DescType containerClass,
  144.                                         const AEDesc *container, long* result)
  145. {   
  146.     AEDesc      aDesc = {typeNull, NULL},
  147.                 tempDesc = {typeNull, NULL};
  148.     TextToken   aTextToken;
  149.     Size        actualSize;
  150.     short        shortResult;
  151.     OSErr       err;
  152.         
  153.             // If it's an object specifier, resolve into a token
  154.     if (typeObjectSpecifier == container->descriptorType)
  155.         err = AEResolve(container, kAEIDoMinimum, &tempDesc);
  156.     else    // Otherwise, just copy it
  157.         err = AEDuplicateDesc(container, &tempDesc);
  158.         
  159.     if (noErr != err) goto done;
  160.     
  161.     *result = -1;            // easily recognized illegal value
  162.         
  163.     switch (desiredType)
  164.     {
  165.         case cDocument:
  166.         case cWindow:
  167.             if ((containerClass == typeNull) || (containerClass == cApplication))
  168.                 *result = CountWindows();
  169.             else
  170.                 err = errAEWrongDataType;
  171.             break;
  172.             
  173.         case cChar:
  174.         case cWord:
  175.         case cParagraph:
  176.             err = AECoerceDesc(&tempDesc, typeMyText, &aDesc);
  177.             if (typeNull == aDesc.descriptorType)
  178.                 err = errAENoSuchObject;
  179.             if (noErr != err) break;
  180.             GetRawDataFromDescriptor(&aDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
  181.  
  182.             err = CountTextElements(TEHandleFromTextToken(&aTextToken),
  183.                                         aTextToken.tokenOffset, aTextToken.tokenLength,
  184.                                                                     desiredType, &shortResult);
  185.             if (noErr != err) break;
  186.             *result = shortResult;
  187.             break;
  188.             
  189.         default:
  190.             err = errAECantHandleClass;
  191.     }
  192.     
  193. done:
  194.     if (tempDesc.dataHandle)
  195.         AEDisposeDesc(&tempDesc);
  196.     if (aDesc.dataHandle)
  197.         AEDisposeDesc(&aDesc);
  198.         
  199.     return(err);
  200. }    // MyCountProc
  201.